package com.bird.设计模式.创建型.单例模式.饿汉单例;

import com.bird.设计模式.创建型.单例模式.懒汉单例.LazySingleton;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;

/**
 * @data 2022/2/25 17:15
 * @author: bird
 * @description: 反射-攻击单例对象
 * // 什么是单例模式： 一个类的实例 从始至终只有一个。如果通过其他的方式创建出来的类的实例那么就破坏单例对象的特性。
 */
public class Tast2 {
    public static void main1(String[] args) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
        //获取当前类Class对象
        Class hungrySingletonClass = HungrySingleton.class;

        //通过反射获取类的构造函数
        Constructor constructor = hungrySingletonClass.getDeclaredConstructor();
        constructor.setAccessible(true);
        // 通过构造器获取类的实例
        HungrySingleton newInstance = (HungrySingleton) constructor.newInstance();

        // 通过调用方法获取类的实例
        HungrySingleton instance = HungrySingleton.getInstance();
        System.out.println(instance);
        System.out.println(newInstance);
        System.out.println(newInstance == instance);

    }


    // 单例模式 防止反射
    public static void main(String[] args) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {

        // 获取当前类的class对象 通过反射
        Class objectClass = LazySingleton.class;
        Constructor constructor = objectClass.getDeclaredConstructor();
        constructor.setAccessible(true);


        //获取类的实例 通过不同的方式
        LazySingleton instance = LazySingleton.getInstance();
        LazySingleton newInstance = (LazySingleton)constructor.newInstance();

        // 打印输出,实例
        System.out.println(instance);
        System.out.println(newInstance);
        System.out.println(newInstance==instance);
    }
}

